package com.soushin.mvpdemo.Utils;

import java.util.ArrayList;
import java.util.List;

import com.soushin.mvpdemo.App;
import com.soushin.mvpdemo.R;
import com.soushin.mvpdemo.model.OperatorModel;

/**
 * 数据工具类
 *
 * @author SouShin
 * @time 2018/11/14 14:51
 */
public class DataUtil {

    /**
     * 获取图片列表
     *
     * @return
     */
    public static List<String> getImageList() {
        List<String> imgList = new ArrayList<>();
        imgList.add("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2110532783,4075431487&fm=26&gp=0.jpg");
        imgList.add("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4153556768,3983133839&fm=26&gp=0.jpg");
        imgList.add("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2256235178,3519038206&fm=11&gp=0.jpg");
        imgList.add("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2953141222,3624001139&fm=26&gp=0.jpg");
        imgList.add("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1455027652,3405167947&fm=26&gp=0.jpg");
        imgList.add("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1453259368,672327677&fm=26&gp=0.jpg");
        imgList.add("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1320117332,1471510482&fm=11&gp=0.jpg");
        imgList.add("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1669685642,3136448935&fm=26&gp=0.jpg");
        imgList.add("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1997694289,3364784765&fm=26&gp=0.jpg");
        imgList.add("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1305556145,134978971&fm=11&gp=0.jpg");
        imgList.add("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3756170124,1026050215&fm=11&gp=0.jpg");
        imgList.add("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3036448549,2814397411&fm=26&gp=0.jpg");
        imgList.add("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1519827916,1392682689&fm=26&gp=0.jpg");
        imgList.add("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=385859341,594087417&fm=26&gp=0.jpg");
        imgList.add("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2522492188,2282988646&fm=26&gp=0.jpg");
        imgList.add("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=68262724,1269221763&fm=26&gp=0.jpg");
        return imgList;
    }

    /**
     * 获取Rxjava2示例列表
     *
     * @return
     */
    public static List<OperatorModel> getExampleList() {
        List<OperatorModel> dataList = new ArrayList<>();
        dataList.add(new OperatorModel("线程调度需要注意的",
                "RxJava 内置的线程调度器的确可以让我们的线程切换得心应手，但其中也有些需要注意的地方。\n" +
                        "- 简单地说，subscribeOn() 指定的就是发射事件的线程，observerOn指定的就是订阅者接收事件的线程。\n" +
                        "- 多次指定发射事件的线程只有第一次指定的有效，也就是说多次调用 subscribeOn() 只有第一次的有效，其余的会被忽略。\n" +
                        "- 但多次指定订阅者接收线程是可以的，也就是说每调用一次 observerOn()，下游的线程就会切换一次。"));
        dataList.add(new OperatorModel("单一的网络请求",
                "1、通过 Observable.create() 方法，调用 OkHttp 网络请求;\n" +
                        "2、通过 map 操作符结合 Gson , 将 Response 转换为 bean 类;\n" +
                        "3、通过 doOnNext() 方法，解析 bean 中的数据，并进行数据库存储等操作;\n" +
                        "4、调度线程，在子线程进行耗时操作任务，在主线程更新 UI;\n" +
                        "5、通过 subscribe(),根据请求成功或者失败来更新 UI。"));
        dataList.add(new OperatorModel("使用框架 RxEasyHttp",
                "1、通过 RxEasyHttp 的 get() 方法获取 Observable 对象(已解析)；\n" +
                        "2、调度线程，根据请求结果更新 UI。"));
        dataList.add(new OperatorModel("结合多个接口的数据再更新 UI",
                "zip 操作符可以把多个 Observable 的数据接口成一个数据源再发出去"));
        dataList.add(new OperatorModel("多个网络请求依次依赖",
                "flatMap 操作符可以让多个网络请求依次依赖,比如:\n" +
                        "1、注册用户前先通过接口A获取当前用户是否已注册，再通过接口B注册;\n" +
                        "2、注册后自动登录，先通过注册接口注册用户信息，注册成功后马上调用登录接口进行自动登录。"));
        dataList.add(new OperatorModel("先读取缓存数据再读取网络请求",
                "实用场景中经常会用到缓存数据，以通过减少频繁的网络请求达到节约流量：\n" +
                        "1、concat 可以做到不交错的发射两个甚至多个 Observable 的发射物;\n" +
                        "2、并且只有前一个 Observable 终止（onComplete）才会订阅下一个 Observable"));
        dataList.add(new OperatorModel("减少频繁的网络请求",
                "设想情景：输入框数据变化或者点击一次按钮时就要进行网络请求，这样会产生大量的网络请求，而实际上又不需要，" +
                        "这时候可以通过 debounce 过滤掉发射频率过快的请求。"));
        dataList.add(new OperatorModel("间隔任务实现心跳",
                "可能我们会遇上各种即时通讯，如果是自己家开发的 IM 即时通讯，我相信在移动端一定少不了心跳包的管理，" +
                        "而我们 RxJava 2.x 的 interval 操作符棒我们解决了这个问题。"));
        dataList.add(new OperatorModel("采用merge合并请求",
                "一定要注意Merge和zip的区别，虽然都是合并多个请求，但是是有区别的，请注意使用场景," +
                        "Merge其实只是将多个Obsevables的输出序列变为一个，方便订阅者统一处理，" +
                        "对于订阅者来说就仿佛只订阅了一个观察者一样。拼接两个/多个Observable的输出，不保证顺序，按照事件产生的顺序发送给订阅者"));

        return dataList;
    }
    /**
     * 获取Rxjava2操作符列表
     *
     * @return
     */
    public static List<OperatorModel> getOperatorList() {
        List<OperatorModel> dataList = new ArrayList<>();
        dataList.add(new OperatorModel(getString(R.string.rx_create), "可用于获取一个被观察的对象"));
        dataList.add(new OperatorModel(getString(R.string.rx_zip), "合并事件专用," +
                "分别从两个上游事件中各取出一个组合," +
                "一个事件只能被使用一次，顺序严格按照事件发送的顺序," +
                "最终下游事件收到的是和上游事件最少的数目相同（必须两两配对，多余的舍弃)"));
        dataList.add(new OperatorModel(getString(R.string.rx_map), "基本是RxJava 最简单的操作符了作用是对上游发送的每一个事件应用一个函数，" +
                "使得每一个事件都按照指定的函数去变化"));
        dataList.add(new OperatorModel(getString(R.string.rx_flatMap), "FlatMap将一个发送事件的上游Observable变换成多个发送事件的Observables， 然后将它们发射的时间合并后放进一个单独的Observable里"));
        dataList.add(new OperatorModel(getString(R.string.rx_concatMap), "concatMap作用和flatMap几乎一模一样，唯一的区别是它能保证事件的顺序"));
        dataList.add(new OperatorModel(getString(R.string.rx_doOnNext), "让订阅者在接收到数据前干点事情的操作符"));
        dataList.add(new OperatorModel(getString(R.string.rx_filter), "过滤操作符，取正确的值"));
        dataList.add(new OperatorModel(getString(R.string.rx_skip), "接受一个long型参数，代表跳过多少个数目的事件再开始接收"));
        dataList.add(new OperatorModel(getString(R.string.rx_take), "用于指定订阅者最多收到多少数据"));
        dataList.add(new OperatorModel(getString(R.string.rx_timer), "在Rxjava中timer 操作符既可以延迟执行一段逻辑，也可以间隔执行一段逻辑\n" +
                "【注意】但在RxJava 2.x已经过时了，现在用interval操作符来间隔执行，详见RxIntervalActivity\n" +
                "timer和interval都默认执行在一个新线程上。"));
        dataList.add(new OperatorModel(getString(R.string.rx_interval), "间隔执行操作，默认在新线程"));
        dataList.add(new OperatorModel(getString(R.string.rx_just), "just操作符，和RxJava 1.x 没有什么区别，就是接受一个可变参数，依次发送"));
        dataList.add(new OperatorModel(getString(R.string.rx_single), "顾名思义，Single只会接收一个参数" +
                "而SingleObserver只会调用onError或者onSuccess"));
        dataList.add(new OperatorModel(getString(R.string.rx_concat), "连接操作符，可接受Observable的可变参数，或者Observable的集合"));
        dataList.add(new OperatorModel(getString(R.string.rx_distinct), "去重操作符，其实就是简单的去重"));
        dataList.add(new OperatorModel(getString(R.string.rx_buffer), "buffer(count, skip)` 从定义就差不多能看出作用了，将 observable 中的数据按 skip（步长）分成最长不超过 count 的 buffer，然后生成一个 observable"));
        dataList.add(new OperatorModel(getString(R.string.rx_debounce), "过滤掉发射速率过快的数据项"));
        dataList.add(new OperatorModel(getString(R.string.rx_defer), "就是在每次订阅的时候就会创建一个新的 Observable"));
        dataList.add(new OperatorModel(getString(R.string.rx_last), "取出最后一个值，参数是没有值的时候的默认值"));
        dataList.add(new OperatorModel(getString(R.string.rx_merge), "将多个Observable合起来，接受可变参数，也支持使用迭代器集合"));
        dataList.add(new OperatorModel(getString(R.string.rx_reduce), "就是一次用一个方法处理一个值，可以有一个seed作为初始值"));
        dataList.add(new OperatorModel(getString(R.string.rx_scan), "和上面的reduce差不多，区别在于reduce()只输出结果，而scan()会将过程中每一个结果输出"));
        dataList.add(new OperatorModel(getString(R.string.rx_window), "按照时间划分窗口，将数据发送给不同的Observable"));
        dataList.add(new OperatorModel(getString(R.string.rx_PublishSubject), "onNext() 会通知每个观察者，仅此而已"));
        dataList.add(new OperatorModel(getString(R.string.rx_AsyncSubject), "在调用 onComplete() 之前，除了 subscribe() 其它的操作都会被缓存，在调用 onComplete() 之后只有最后一个 onNext() 会生效"));
        dataList.add(new OperatorModel(getString(R.string.rx_BehaviorSubject), "BehaviorSubject 的最后一次 onNext() 操作会被缓存，然后在 subscribe() 后立刻推给新注册的 Observer"));
        dataList.add(new OperatorModel(getString(R.string.rx_Completable), "只关心结果，也就是说 Completable 是没有 onNext 的，要么成功要么出错，不关心过程，在 subscribe 后的某个时间点返回结果"));
        dataList.add(new OperatorModel(getString(R.string.rx_Flowable), "专用于解决背压问题"));
        return dataList;
    }

    private static String getString(int res) {
        return App.getInstance().getString(res);
    }

}
